package factura.beans;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.model.SelectItem;

import org.richfaces.component.UIDataTable;

import com.sun.org.apache.bcel.internal.generic.IINC;

import factura.dao.HibernateUtilDAO;
import factura.modelo.ImpuestoValor;
import factura.modelo.InformacionAdicional;
import factura.modelo.Producto;
import factura.modelo.ProductoImpuesto;

@ManagedBean
@SessionScoped
public class ProductosBean {

	// PRODUCTO
	private List<ImpuestoValor> listaIva = new ArrayList<ImpuestoValor>();

	// LISTA ICE
	private List<ImpuestoValor> listaIce = new ArrayList<ImpuestoValor>();
	// INGRESO DE PRODUCTOS

	private int idProducto;
	private String codigoprincipal;
	private String codigoauxiliar;
	private String nombre;
	private BigDecimal valorunitario;
	private String tipoproducto;
	private String iva;
	private String ice;
	private String idImpuestoIva;
	private String idImpuestoIce;
	private String descripcion;
	private String atributo1;
	private String atributo2;
	private String atributo3;
	private String valor1;
	private String valor2;
	private String valor3;

	private List<Producto> listaProductoIngreso = new ArrayList<Producto>();
	private List<ProductoImpuesto> productoImpuestoIceLista = new ArrayList<ProductoImpuesto>();
	private List<ProductoImpuesto> productoImpuestoIvaLista = new ArrayList<ProductoImpuesto>();
	private List<InformacionAdicional> informacionAdicionalLista = new ArrayList<InformacionAdicional>();
	private List<InformacionAdicional> listaInformacionProducto;
	private UIDataTable tablaProducto;
	private UIDataTable tablaListaProducto;

	// CARGAR PRODUCTOS EN LISTA

	public UIDataTable getTablaListaProducto() {
		return tablaListaProducto;
	}

	public void setTablaListaProducto(UIDataTable tablaListaProducto) {
		this.tablaListaProducto = tablaListaProducto;
	}

	public String cargarProductos() {

		Producto p = new Producto();
		p.setIdProducto(idProducto);
		p.setCodigoprincipal(codigoprincipal);
		p.setCodigoauxiliar(codigoauxiliar);
		p.setNombre(nombre);
		p.setValorunitario(valorunitario);
		p.setTipoproducto(tipoproducto);

		p.setIva("S");

		// Ingresar ICE al producto
		// ingresarIce(p);

		// Ingresar iva al producto
		ingresarIva(p);

		// Ingresar Informacion adicional al producto
		ingresarInformacionAdicional(p);

		listaProductoIngreso.add(p);
		return "";
	}

	// Ingresar ICE al producto
	public void ingresarIce(Producto producto) {
		productoImpuestoIceLista.clear();
		ImpuestoValor impuestoValor = new ImpuestoValor();
		ProductoImpuesto pi = new ProductoImpuesto();

		if (this.getIdImpuestoIce().equals("N")) {
			producto.setIce("N");

		} else {
			producto.setIce("S");
			impuestoValor.setIdImpuestovalor(getIdImpuestoIce());
			pi.setImpuestoValor(impuestoValor);
			pi.setProducto(producto);

			productoImpuestoIceLista.add(pi);
		}
	}

	// Ingresar iva al producto
	public void ingresarIva(Producto producto) {
		productoImpuestoIvaLista.clear();
		ProductoImpuesto productoImpuestoIva = new ProductoImpuesto();
		ImpuestoValor impuestoValorIva = new ImpuestoValor();
		impuestoValorIva.setIdImpuestovalor(getIdImpuestoIva());
		productoImpuestoIva.setImpuestoValor(impuestoValorIva);
		productoImpuestoIva.setProducto(producto);
		productoImpuestoIvaLista.add(productoImpuestoIva);
	}

	// Ingresar Informacion adicional al producto
	public void ingresarInformacionAdicional(Producto producto) {
		informacionAdicionalLista.clear();
		InformacionAdicional informacionAdicional;
		if (atributo1 != "" && valor1 != "") {
			informacionAdicional = new InformacionAdicional();
			informacionAdicional.setProducto(producto);
			informacionAdicional.setAtributo(atributo1);
			informacionAdicional.setValor(valor1);
			informacionAdicionalLista.add(informacionAdicional);
		}
		if (atributo2 != "" && valor2 != "") {
			informacionAdicional = new InformacionAdicional();
			informacionAdicional.setProducto(producto);
			informacionAdicional.setAtributo(atributo2);
			informacionAdicional.setValor(valor2);
			informacionAdicionalLista.add(informacionAdicional);
		}
		if (atributo3 != "" && valor3 != "") {
			informacionAdicional = new InformacionAdicional();
			informacionAdicional.setProducto(producto);
			informacionAdicional.setAtributo(atributo3);
			informacionAdicional.setValor(valor3);
			informacionAdicionalLista.add(informacionAdicional);
		}

	}

	/**
	 * GUARDAR LOS PRODUCTOS EN LA BDD
	 * 
	 * @return
	 */

	public String ingresarProducto() {
		try {
			for (int i = 0; i < listaProductoIngreso.size(); i++) {
				HibernateUtilDAO.insertarObjeto(listaProductoIngreso.get(i));
			}
			for (int i = 0; i < productoImpuestoIceLista.size(); i++) {
				HibernateUtilDAO
						.insertarObjeto(productoImpuestoIceLista.get(i));
			}
			for (int i = 0; i < productoImpuestoIvaLista.size(); i++) {
				HibernateUtilDAO
						.insertarObjeto(productoImpuestoIvaLista.get(i));
			}
			if (informacionAdicionalLista != null) {
				for (int i = 0; i < informacionAdicionalLista.size(); i++) {
					HibernateUtilDAO.insertarObjeto(informacionAdicionalLista
							.get(i));
				}
			}
		} catch (Exception e) {
			e.getStackTrace();
		}
		listaProductoIngreso = new ArrayList<Producto>();
		return "";
	}

	// BORRAR PROD DE LIST

	public String borrarProductoLista() {
		Producto producto = (Producto) getTablaListaProducto().getRowData();
		listaProductoIngreso.remove(producto);
		return "";
	}

	// VER EDICION PRODUCTO

	public String editProducto() {
		Producto p = (Producto) tablaProducto.getRowData();
		idProducto = p.getIdProducto();
		codigoprincipal = p.getCodigoprincipal();
		codigoauxiliar = p.getCodigoauxiliar();
		nombre = p.getNombre();
		valorunitario = p.getValorunitario();
		if (p.getTipoproducto().equals("Bien")) {
			tipoproducto = "B";
		} else {
			tipoproducto = "S";
		}
		buscarProductoImpuesto(p);
		buscarInformacionProducto(p);

		return "";
	}

	private List<ProductoImpuesto> listaProductoImpuesto;

	// Buscar el ice de los productos
	public void buscarProductoImpuesto(Producto producto) {

		listaProductoImpuesto = new ArrayList<ProductoImpuesto>();

		try {
			listaProductoImpuesto = HibernateUtilDAO.findByFiltro(
					"ProductoImpuesto",
					"id_producto=" + producto.getIdProducto());

		} catch (Exception e) {
			e.printStackTrace();
		}
		String impuesto = "";
		for (ProductoImpuesto lista : listaProductoImpuesto) {
			impuesto = lista.getImpuestoValor().getIdImpuestovalor();
		}
		idImpuestoIva = impuesto;
		/*
		 * try { if (listaImpuestoValorIva.size() == 0) { listaImpuestoValorIva
		 * = HibernateUtilDAO .findByFiltro( "ImpuestoValor",
		 * "id_impuestovalor='" + impuesto +
		 * "' and id_impuesto=2 and (TIPO_IMPUESTO='I' or TIPO_IMPUESTO='A')");
		 * }
		 * 
		 * if (impuestoValorIceLista.size() == 0) { impuestoValorIceLista =
		 * HibernateUtilDAO .findByFiltro( "ImpuestoValor", "id_impuestovalor='"
		 * + impuesto +
		 * "' and id_impuesto=3 and (TIPO_IMPUESTO='I' or TIPO_IMPUESTO='A')" );
		 * }
		 * 
		 * } catch (Exception e) { System.out.println("Error lista IVA");
		 * 
		 * }
		 * 
		 * 
		 * }
		 */

	}

	// Buscar Informacion adicional de los productos

	public void buscarInformacionProducto(Producto producto) {

		listaInformacionProducto = new ArrayList<InformacionAdicional>();

		try {
			listaInformacionProducto = HibernateUtilDAO.findByFiltro(
					"InformacionAdicional",
					"id_producto=" + producto.getIdProducto());

		} catch (Exception e) {
			e.printStackTrace();
		}

		if (listaInformacionProducto.size() == 0) {
			atributo1 = "";
			valor1 = "";
			atributo2 = "";
			valor2 = "";
			atributo3 = "";
			valor3 = "";
		} else {
			for (int i = 0; i < listaInformacionProducto.size(); i++) {
				if (i == 0) {
					atributo1 = listaInformacionProducto.get(i).getAtributo();
					valor1 = listaInformacionProducto.get(i).getValor();

				}

				if (i == 1) {
					atributo2 = listaInformacionProducto.get(i).getAtributo();
					valor2 = listaInformacionProducto.get(i).getValor();
				}
				if (i == 2) {
					atributo3 = listaInformacionProducto.get(i).getAtributo();
					valor3 = listaInformacionProducto.get(i).getValor();
				}

			}
		}
	}

	// VER EDICION PRODUCTO

	public String saveEditProducto() {
		Producto p = new Producto();
		ProductoImpuesto productoImpuestoIva = new ProductoImpuesto();
		ImpuestoValor impuesto = new ImpuestoValor();
		p.setIdProducto(idProducto);
		p.setCodigoprincipal(codigoprincipal);
		p.setCodigoauxiliar(codigoauxiliar);
		p.setNombre(nombre);
		p.setValorunitario(valorunitario);
		p.setTipoproducto(tipoproducto);
		p.setIva("S");
		impuesto.setIdImpuestovalor(idImpuestoIva);
		if (listaProductoImpuesto.size() != 0) {
			productoImpuestoIva.setIdProductoimpuesto(listaProductoImpuesto
					.get(0).getIdProductoimpuesto());
		}
		productoImpuestoIva.setImpuestoValor(impuesto);
		productoImpuestoIva.setProducto(p);

		List<InformacionAdicional> listaInformacion = new ArrayList<InformacionAdicional>();
		InformacionAdicional informacion = new InformacionAdicional();
		InformacionAdicional informacion2 = new InformacionAdicional();
		InformacionAdicional informacion3 = new InformacionAdicional();
		for (int i = 0; i < listaInformacionProducto.size(); i++) {
			informacion.setIdInfoadicional(listaInformacionProducto.get(i)
					.getIdInfoadicional());
			try {
				HibernateUtilDAO.eliminarObjeto(informacion);
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}

		if (atributo1 != "" && valor1 != "") {
			informacion.setAtributo(atributo1);
			informacion.setValor(valor1);
			informacion.setProducto(p);

			listaInformacion.add(informacion);
		}
		if (atributo2 != "" && valor2 != "") {
			informacion2.setAtributo(atributo2);
			informacion2.setValor(valor2);
			informacion2.setProducto(p);

			listaInformacion.add(informacion2);

		}
		if (atributo3 != "" && valor3 != "") {
			informacion3.setAtributo(atributo3);
			informacion3.setValor(valor3);
			informacion3.setProducto(p);
			listaInformacion.add(informacion3);
		}
		listaInformacionProducto = listaInformacion;
		try {
			HibernateUtilDAO.actualizar(p);
			HibernateUtilDAO.actualizar(productoImpuestoIva);

			for (int i = 0; i < listaInformacion.size(); i++) {
				HibernateUtilDAO.insertarObjeto(listaInformacion.get(i));

			}
		} catch (Exception e) {
			e.getStackTrace();
		}
		return "";
	}

	// Editar iva al producto
	public ProductoImpuesto editarIva(Producto producto) {

		ProductoImpuesto productoImpuestoIva = new ProductoImpuesto();
		ImpuestoValor impuestoValorIva = new ImpuestoValor();
		impuestoValorIva.setIdImpuestovalor(idImpuestoIva);
		productoImpuestoIva.setImpuestoValor(impuestoValorIva);
		productoImpuestoIva.setProducto(producto);
		return productoImpuestoIva;
	}

	// BORRAR PRODUCTO

	public String eliminarProducto() {
		Producto p = (Producto) tablaProducto.getRowData();
		try {
			HibernateUtilDAO.eliminarObjeto(p);
		} catch (Exception e) {
			e.getStackTrace();
		}
		return "";
	}

	// Obtener Iva

	public List<ImpuestoValor> getListaIva() {
		try {
			listaIva = HibernateUtilDAO
					.findByFiltro("ImpuestoValor",
							"id_impuesto=2 and (TIPO_IMPUESTO='I' or TIPO_IMPUESTO='A')");
		} catch (Exception e) {
			e.getStackTrace();
		}

		return listaIva;
	}

	public ArrayList<SelectItem> getImpuestoIva() {

		ArrayList<SelectItem> impuestoIva = new ArrayList<SelectItem>();
		impuestoIva.clear();
		List<ImpuestoValor> impuestoValor = getListaIva();
		if (impuestoValor != null) {
			for (ImpuestoValor p : impuestoValor) {
				impuestoIva.add(new SelectItem(p.getIdImpuestovalor(), p
						.getDescripcion()));
			}
		}
		return impuestoIva;
	}

	// Obtener lista del ICE
	public List<ImpuestoValor> getListaIce() {
		try {
			listaIce = HibernateUtilDAO
					.findByFiltro("ImpuestoValor",
							"id_impuesto=3 and (TIPO_IMPUESTO='I' or TIPO_IMPUESTO='A')");
		} catch (Exception e) {
			e.getStackTrace();
		}

		return listaIce;
	}

	public ArrayList<SelectItem> getImpuestoIce() {

		ArrayList<SelectItem> impuestoIce = new ArrayList<SelectItem>();
		impuestoIce.clear();
		List<ImpuestoValor> impuestoValor = getListaIce();
		if (impuestoValor != null) {
			for (ImpuestoValor p : impuestoValor) {
				impuestoIce.add(new SelectItem(p.getIdImpuestovalor(), p
						.getDescripcion()));
			}
		}
		return impuestoIce;
	}

	public void setListaIva(List<ImpuestoValor> listaIva) {
		this.listaIva = listaIva;
	}

	public int getIdProducto() {
		return this.idProducto;
	}

	public void setIdProducto(int idProducto) {
		this.idProducto = idProducto;
	}

	public String getCodigoprincipal() {
		return this.codigoprincipal;
	}

	public void setCodigoprincipal(String codigoPrincipal) {
		this.codigoprincipal = codigoPrincipal;
	}

	public String getCodigoauxiliar() {
		return this.codigoauxiliar;
	}

	public void setCodigoauxiliar(String codigoAuxiliar) {
		this.codigoauxiliar = codigoAuxiliar;
	}

	public String getNombre() {
		return this.nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	public BigDecimal getValorunitario() {
		return this.valorunitario;
	}

	public void setValorunitario(BigDecimal valorUnitario) {
		this.valorunitario = valorUnitario;
	}

	public String getTipoproducto() {
		return this.tipoproducto;
	}

	public void setTipoproducto(String tipoproducto) {
		this.tipoproducto = tipoproducto;
	}

	public String getIva() {
		return this.iva;
	}

	public void setIva(String iva) {
		this.iva = iva;
	}

	public String getIce() {
		return this.ice;
	}

	public void setIce(String ice) {
		this.ice = ice;
	}

	public void setListaProductoIngreso(List<Producto> listaProductoIngreso) {
		this.listaProductoIngreso = listaProductoIngreso;
	}

	public List<Producto> getListaProductoIngreso() {
		return listaProductoIngreso;
	}

	// REPORTE DE PRODUCTOS

	private List<Producto> listaProductoBdd;

	public void setListaProductoBdd(List<Producto> listaProductoBdd) {

		this.listaProductoBdd = listaProductoBdd;
	}

	public List<Producto> getListaProductoBdd() {
		try {
			listaProductoBdd = HibernateUtilDAO.findAll("Producto");
		} catch (Exception e) {
			e.getStackTrace();
		}

		return tipoProducto();
	}

	public List<Producto> tipoProducto() {
		List<Producto> lp2 = new ArrayList<Producto>();
		if (listaProductoBdd.size() > 0) {
			Iterator<Producto> iterator = listaProductoBdd.listIterator();

			while (iterator.hasNext()) {

				Producto p = (Producto) iterator.next();
				if (p.getTipoproducto().equals("B")) {
					p.setTipoproducto("Bien");
				} else {
					p.setTipoproducto("Servicio");
				}

				lp2.add(p);
			}
		}
		return lp2;
	}

	public void setTablaProducto(UIDataTable tablaProducto) {
		this.tablaProducto = tablaProducto;
	}

	public UIDataTable getTablaProducto() {
		return tablaProducto;
	}

	public String getIdImpuestoIva() {
		return idImpuestoIva;
	}

	public void setIdImpuestoIva(String idImpuestoIva) {
		this.idImpuestoIva = idImpuestoIva;
	}

	public String getDescripcion() {
		return descripcion;
	}

	public void setDescripcion(String descripcion) {
		this.descripcion = descripcion;
	}

	public void setListaIce(List<ImpuestoValor> listaIce) {
		this.listaIce = listaIce;
	}

	public String getIdImpuestoIce() {
		return idImpuestoIce;
	}

	public void setIdImpuestoIce(String idImpuestoIce) {
		this.idImpuestoIce = idImpuestoIce;
	}

	public String getAtributo1() {
		return atributo1;
	}

	public void setAtributo1(String atributo1) {
		this.atributo1 = atributo1;
	}

	public String getAtributo2() {
		return atributo2;
	}

	public void setAtributo2(String atributo2) {
		this.atributo2 = atributo2;
	}

	public String getAtributo3() {
		return atributo3;
	}

	public void setAtributo3(String atributo3) {
		this.atributo3 = atributo3;
	}

	public String getValor1() {
		return valor1;
	}

	public void setValor1(String valor1) {
		this.valor1 = valor1;
	}

	public String getValor2() {
		return valor2;
	}

	public void setValor2(String valor2) {
		this.valor2 = valor2;
	}

	public String getValor3() {
		return valor3;
	}

	public void setValor3(String valor3) {
		this.valor3 = valor3;
	}

}
